草庐IT

C++ make_shared 不可用

全部标签

c++ - 图节点父列表中的 weak_ptr VS shared_ptr

我有一个由Graph和Node类实现的有向无环图。每个节点都有一个指向子节点的指针列表和一个指向父节点的指针列表。我最近添加了父级,因为一些算法需要快速访问父级列表,而且图很小,每个节点只有很少的连接,所以没有内存问题。子列表使用std::shared_ptr以便节点至少在它们有父节点时保留在内存中。但是我不希望节点拥有它的父节点,所以我使用weak_ptr作为指向父节点的指针。但是后来算法出了问题。算法必须从weak_ptr创建一个新的shared_ptr,所以我不能直接使用operator==,并且使用标准函数如std::find()需要编写一个调用my_weak_ptr.lock

c++ - 为什么 std::make_tuple 将 std::reference_wrapper<X> 参数转换为 X&?

在C++11标准中它声明(参见cppreference.com,另请参见标准的第20.4.2.4节)它声明templatetuplemake_tuple(Types&&...args);Createsatupleobject,deducingthetargettypefromthetypesofarguments.ForeachTiinTypes...,thecorrespondingtypeViinVtypes...isstd::decay::typeunlessapplicationofstd::decayresultsinstd::reference_wrapperforsome

c++ - 使用 std::dynamic_pointer_cast 向上转换 std::shared_ptr

我开始在C++0X/11中使用智能指针,但遇到了一个特殊情况。我想使用shared_ptr向上转换一个对象的实例。Extend类继承自Base类,其中Base类具有虚拟析构函数以使其具有多态性(否则dynamic_pointer_cast会提示非多态类转换)。如果因此:std::shared_ptrobj=std::make_shared();然后我做:obj=std::dynamic_pointer_cast(obj);安全吗?其他指向该对象的指针会怎样?是否只有obj将其视为Extend,而其他共享指针仍将其视为Base?向上转换同一实例是否安全,还是我应该做其他事情?编辑:感谢您

c++ - std::shared_ptr - 将共享指针作为参数传递的最佳实践

我已经离开严肃的C++大约十年了。我又回来了,目前正在从事一个项目,以完全熟悉C++11。关于如何最好地传递std::shared_ptr,我遇到了一些生存危机。举个简单的例子,采用以下设置:classServiceB{public:ServiceB(){}};classServiceA{public:ServiceA(std::shared_ptr&serviceB):_serviceB(serviceB){}private:std::shared_ptr_serviceB;};classRoot{public:Root():_serviceB(std::shared_ptr(new

c++ - 将 shared_ptr 分配给数组的偏移量

假设我有一个数组的shared_ptr:std::shared_ptrsp(newT[10],[](T*p){delete[]p;});还有一个方法:shared_ptrptr_at_offset(intoffset){//Iwanttoreturnashared_ptrto(sp.get()+offset)here//inawaythatthereferencecounttospisincremented...}基本上,我想做的是返回一个新的shared_ptr来增加引用计数,但指向原始数组的偏移量;我想避免在调用者以某个偏移量使用数组时删除数组。如果我只是返回sp.get()+of

c++ - 在模板实例化之间共享静态成员? (不可能的?)

我正在做一些可能很愚蠢的事情,但如果它有效,那就太好了。我正在尝试以一种我需要自己的本质上是全局的查找结构(但理想情况下封装为类变量)的方式来专门化类型,但我希望对象是类型安全的,因此它们是参数化的。因此,基本上我有templateclassSpecialArray{//...private:staticmaplookupTable}不管出于什么原因,直到我去初始化lookupTable时我才想到当我说templateSpecialArray::lookupTable;将有许多不同的lookupTable运行附加到SpecialArray的各种实例。我怀疑这可能只是一个白日梦,正确的答

c++ - vector 迭代器在 for 循环中不可取消引用

我正在使用一个循环来计算一个词被输入了多少次然后打印这个词以及它被输入了多少次,这有效但它从不打印最后一个词,我将它按字母顺序排序。在打印最后一个字之前,它会错误地指出迭代器不可取消引用。这是我的循环代码:for(vector::iteratorit=v.begin();it!=v.end();++it){if(*it==*(it+1)){count++;}elseif(*it!=*(it+1)){count++;cout 最佳答案 你的代码有未定义的行为-假设it指向v的最后一个元素,然后你试图取消引用v.end()*(it+1)

c++ - 创建 shared_ptr 到堆栈对象

在我的方法中,Player对象的创建方式如下:Playerplayer(fullName,age);我的老师给了我们一段带有构造函数的代码,该构造函数将shared_ptr传递给玩家对象。//constructoroftheclassSomeClass(conststd::shared_ptrclient,std::shared_ptrplayer)假设我们要调用SomeClass的构造函数并传递我们在堆栈上创建的播放器对象。从堆栈对象创建shared_ptr是否安全/可能/好?为了让问题更容易理解,假设我们有两个大代码项目,我们想合并它们,以便从一个项目调用另一个项目的方法,我们是否

c++ - 防止多个 shared_ptr 指向同一个对象的最佳方法

将相同的指针发送到两个不同的shared_ptr是不好的,它会导致双重释放,如下所示:int*p=newint;std::shared_ptrp1(p);std::shared_ptrp2(p);//BAD您可以使用std::enable_shared_from_this实现相同的目的:classGood:publicstd::enable_shared_from_this{public:std::shared_ptrgetptr(){returnshared_from_this();}};intmain(){std::shared_ptrgp1(newGood);std::share

C++11 std::shared_ptr + boost::序列化

这个问题在这里已经有了答案:Howcanboost::serializationbeusedwithstd::shared_ptrfromC++11?(7个答案)boostserializeandstd::shared_ptr(2个答案)关闭9年前。嗨,有人已经成功地使用boost::serialization序列化了C++11std::shared_ptr。那里有很多过时的帖子,但没有一个具有可接受的解决方案。我不打算讨论为什么我要使用std::shared_ptr只是接受它!我找到了另一个帖子:boostserializeandstd::shared_ptr但它没有回答我如何序列化